// 封装Axios
import axios from 'axios'
// Cookie
import { getToken } from './auth'
// ElementUI
import { Message, MessageBox } from 'element-ui'
// Store
import store from '../store/index'

// 是否重新登录
const isRelogin = {
  show: false
}

// 创建Axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_URL,
  timeout: 10000
})

// 请求拦截器
service.interceptors.request.use(config => {
  const noToken = (config.headers || {}).noToken === true
  if (getToken() && !noToken) {
    config.headers.Authorization = 'Bearer ' + getToken()
  }
  return config
},
// 失败请求
error => {
  Message({
    message: error.message,
    type: 'error',
    duration: 5 * 1000
  })
  return Promise.reject(error)
}
)

// 响应拦截器
service.interceptors.response.use(res => {
  // 根据响应状态码处理响应
  if (res.data.code === 500) {
    return Promise.reject(new Error(res.data.msg))
  } else if (res.data.code === 401) {
    if (!isRelogin.show) {
      isRelogin.show = true
      // 处理Token过期或者Token失效的逻辑
      MessageBox.confirm('登录状态已失效请重新登录', {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消'
      }).then(() => {
        isRelogin.show = false
        // 重新退出登录
        store.dispatch('logOut').then(() => {
        // 重定向
          location.href = '/login'
        })
      }).catch(() => {
        isRelogin.show = false
      })
    }

    return Promise.reject(new Error('无效的会话 , 或者会话过期 , 请重新登录'))
  } else if (res.data.code !== 200) {
    return Promise.reject(new Error(res.data.msg))
  } else {
    // 解构一层响应并返回
    return res.data
  }
},
// 服务器异常处理
error => {
  // 拿到异常信息
  let { message } = error
  // 判断请求服务器超时 includes:字符串方法:判断当前字符串是否包含了某些字符
  if (message.includes('timeout')) {
    // 改变消息提醒
    message = '系统接口请求超时'
  } else if (message.includes('Request failed with status code')) {
    // 改变消息提示
    message = '系统接口' + message.substr(message.length - 3) + '异常'
  }
  Message({
    message: message,
    type: 'error',
    duration: 5 * 1000
  })
  return Promise.reject(error)
}
)

export default service
